home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / PACKET / CBBS60SO.ZIP / MBCMD.C < prev    next >
Text File  |  1989-02-05  |  8KB  |  330 lines

  1.  
  2. /*
  3.  *  MBCMD.C - 1/31/88 - Command parser and dispatch.
  4.  */
  5.  
  6. #include "mb.h"
  7.  
  8. docmd()
  9. {
  10.   typedef struct
  11.   {
  12.     char  n1, n2;    /* The two command letters        */
  13.     byte  args;      /* Number of arguments required   */
  14.     word  mode;      /* Bitmask of allowed port modes  */
  15.     int   (*fp)();   /* Pointer to function return int */
  16.   } CMDDEF;
  17.  
  18.   register CMDDEF *cp;
  19.   register int status;
  20.  
  21. /*
  22.  *  The functions that do the commands.
  23.  */
  24.  
  25.   extern int lock();
  26.   extern int all_fwd();
  27.   extern int klmsg();
  28.   extern int lstmsg();
  29.   extern int rdmsg();
  30.   extern int sndmlt();
  31.   extern int sndmsg();
  32.   extern int fwdcmd();
  33.   extern int done();
  34.   extern int help();
  35.   extern int klmsgm();
  36.   extern int mkrem();
  37.   extern int mksys();
  38.   extern int makmlt();
  39.   extern int makmsg();
  40.   extern int dupmsg();
  41.   extern int filmsg();
  42.   extern int setunt();
  43.   extern int edmsg();
  44.   extern int edtfc();
  45.   extern int copfil();
  46.   extern int renfil();
  47.   extern int kilfil();
  48.   extern int uloadl();
  49.   extern int uloadr();
  50.   extern int dloads();
  51.   extern int dloadi();
  52.   extern int dloadl();
  53.   extern int dloadr();
  54.   extern int bye();
  55.   extern int lterm();
  56.   extern int settime();
  57.   extern int chguser();
  58.   extern int chgparam();
  59.   extern int utalk();
  60.   extern int rdmsgm();
  61.   extern int duser();
  62.   extern int dwuser();
  63.   extern int edport();
  64.   extern int eduser();
  65.   extern int edusera();
  66.   extern int puser();
  67.   extern int sfwd();
  68.   extern int newfwd();
  69.   extern int prthrd();
  70.   extern int connuser();
  71.   extern int ctncv();
  72.   extern int mtncv();
  73.   extern int utncv();
  74.   extern int prtdir();
  75.   extern int prtver();
  76. #if nncmd
  77.   extern int donet();
  78. #endif
  79.   extern int dosys();
  80.  
  81. /*
  82.  *  Command char 1, char 2, # args, modes allowed, function
  83.  */
  84.  
  85. static CMDDEF cmds[] =
  86. {
  87.  
  88.   '!', ' ', 2, local,          dosys,
  89.   '!', ' ', 3, local,          dosys,
  90.   '!', ' ', 4, local,          dosys,
  91.   '!', ' ', 5, local,          dosys,
  92.  
  93.   '@', ' ', 1, remote,         mksys,
  94.   '@', ' ', 1, sysop,          mkrem,
  95.  
  96.   '?', ' ', 1, all,            help,
  97.   '?', ' ', 2, all,            help,
  98.  
  99.   'A', ' ', 1, ops,            all_fwd,
  100.   'A', 'I', 1, ops,            all_fwd,
  101.   'A', 'H', 1, ops,            lock,
  102.   'B', ' ', 1, all,            bye,
  103.  
  104.   'C', ' ', 3, ops,            settime,
  105.   'C', ' ', 2, all,            connuser,
  106.   'C', 'M', 3, ops,            dupmsg,
  107.   'C', 'M', 5, ops,            dupmsg,
  108.   'C', 'M', 7, ops,            dupmsg,
  109.   'C', '*', 1, remote,         utncv,
  110.   'C', '*', 2, remote,         ctncv,
  111.   'C', '*', 4, remote,         ctncv,
  112.  
  113.   'D', 'L', 1, ops,            duser,
  114.   'D', 'L', 2, ops,            duser,
  115.   'D', 'M', 1, ops,            duser,
  116.   'D', 'M', 2, ops,            duser,
  117.   'D', 'S', 1, ops,            duser,
  118.   'D', 'S', 2, ops,            duser,
  119.   'D', 'U', 1, ops,            duser,
  120.   'D', 'U', 2, ops,            duser,
  121.   'D', 'W', 1, ops,            dwuser,
  122.   'D', 'W', 2, ops,            dwuser,
  123.   'D', 'X', 1, ops,            duser,
  124.   'D', 'X', 2, ops,            duser,
  125.   'D', '*', 2, local,          dloadl,
  126.   'D', '*', 2, remote,         dloadr,
  127.   'D', '*', 2, sysop,          dloads,
  128.  
  129.   'E', ' ', 2, ops,            edmsg,
  130.   'E', 'P', 2, ops,            edport,
  131.   'E', 'S', 1, ops,            chgparam,
  132.   'E', 'T', 2, all,            edtfc,
  133.   'E', 'U', 1, ops,            edusera,
  134.   'E', 'U', 2, ops,            eduser,
  135.  
  136.   'F', '>', 1, remote,         fwdcmd,
  137.   'F', '*', 3, ops,            filmsg,
  138.   'F', '*', 4, ops,            filmsg,
  139.  
  140.   'G', 'M', 1, ops,            setunt,
  141.   'G', 'R', 1, ops,            setunt,
  142.   'G', 'R', 2, ops,            setunt,
  143.   'G', 'U', 1, ops,            setunt,
  144.  
  145.   'H', ' ', 1, all,            help,
  146.   'H', ' ', 2, all,            help,
  147.  
  148.   'I', ' ', 1, all,            dloadi,
  149.  
  150.   'J', '*', 1, all,            prthrd,
  151.  
  152.   'K', ' ', 2, all,            klmsg,
  153.   'K', 'F', 1, ops,            klmsgm,
  154.   'K', 'F', 2, ops,            klmsgm,
  155.   'K', 'M', 1, all,            klmsgm,
  156.   'K', 'O', 1, ops,            klmsgm,
  157.   'K', 'O', 2, ops,            klmsgm,
  158.   'K', 'T', 2, all,            klmsg,
  159.   'K', 'Y', 1, ops,            klmsgm,
  160.   'K', 'Y', 2, ops,            klmsgm,
  161.  
  162.   'L', '*', 1, all,            lstmsg,
  163.   'L', '*', 2, all,            lstmsg,
  164.   'L', '*', 3, all,            lstmsg,
  165.  
  166.   'M', 'M', 3, ops,            makmlt,
  167.   'M', 'M', 4, ops,            makmlt,
  168.   'M', '*', 3, ops,            makmsg,
  169.   'M', '*', 4, ops,            makmsg,
  170.   'M', '*', 5, ops,            makmsg,
  171.   'M', '*', 6, ops,            makmsg,
  172.   'M', '*', 7, ops,            makmsg,
  173.   'M', '*', 8, ops,            makmsg,
  174.   'M', '*', 1, remote,         mtncv,
  175.  
  176.   'N', ' ', 2, all,            chguser,
  177.   'N', ' ', 3, ops,            renfil,
  178.   'N', 'E', 1, all,            chguser,
  179.   'N', 'H', 2, all,            chguser,
  180. #if nncmd
  181.   'N', 'N', 5, ops,            donet,
  182. #endif
  183.   'N', 'Z', 2, all,            chguser,
  184.  
  185.   'P', ' ', 2, all,            puser,
  186.  
  187.   'Q', ' ', 1, local,          done,
  188.  
  189.   'R', ' ', 2, all,            rdmsg,
  190.   'R', 'H', 2, all,            rdmsg,
  191.   'R', 'M', 1, all,            rdmsgm,
  192.  
  193.   'S', 'M', 2, ops,            sndmlt,
  194.   'S', 'M', 3, ops,            sndmlt,
  195.   'S', '*', 2, all,            sndmsg,
  196.   'S', '*', 3, all,            sndmsg,
  197.   'S', '*', 4, all,            sndmsg,
  198.   'S', '*', 5, all,            sndmsg,
  199.   'S', '*', 6, all,            sndmsg,
  200.   'S', '*', 7, all,            sndmsg,
  201.  
  202.   'T', ' ', 1, remote,         utalk,
  203.   'T', '*', 1, local,          lterm,
  204.   'T', '*', 2, local,          lterm,
  205.  
  206.   'U', '*', 2, ops,            uloadl,
  207.   'U', '*', 2, remote,         uloadr,
  208.  
  209.   'V', ' ', 1, all,            prtver,
  210.   'V', ' ', 3, ops,            copfil,
  211.  
  212.   'W', '*', 1, all,            prtdir,
  213.   'W', '*', 2, all,            prtdir,
  214.  
  215.   'X', ' ', 1, ops,            sfwd,
  216.   'X', ' ', 2, ops,            sfwd,
  217.   'X', 'I', 1, ops,            sfwd,
  218.   'X', 'I', 2, ops,            sfwd,
  219.  
  220.   'Y', 'F', 1, ops,            newfwd,
  221.   'Y', 'F', 2, ops,            newfwd,
  222.  
  223.   'Z', '*', 2, ops,            kilfil,
  224.  
  225.   '\0', ' ', 0, 0, 0, 0
  226. };
  227.  
  228.   port->cmdcnt++;
  229.  
  230.   if (strlen(port->fld[0]) < 3)
  231.     for (cp = cmds; cp->n1; cp++)
  232.     if (port->mode & cp->mode)
  233.     if (port->opt1 is cp->n1)
  234.     if ((port->opt2 is cp->n2) or (cp->n2 is '*'))
  235.     if (port->flds is cp->args) { status = (*cp->fp)(); return; }
  236.  
  237.   if ((port->opt1 is '[') and (port->cmdcnt is 1)) { isbid(); return;}
  238.  
  239.   port->msg = mwhat;
  240.   port->errors++;
  241. }
  242.  
  243. /*
  244.  *  User wants to log out.
  245.  *  Set the flag so they will be logged out.
  246.  */
  247.  
  248. bye()
  249. {
  250.   pt_flag = 0;
  251.   port->mode = logout;
  252. }
  253.  
  254. /*
  255.  *  User done being remote sysop.
  256.  *  Make them normal user again.
  257.  */
  258.  
  259. mkrem()
  260. {
  261.   port->flags clrbit p_clrsys;
  262.   port->mode = remote;
  263.   if (!port->tmode)
  264.   {
  265.      cmdtnc();
  266.      onetnc("cr on\n");
  267.      onetnc("cp of\n");
  268.      onetnc("se $0d\n");
  269.      convtnc();
  270.   }
  271. }
  272.  
  273. /*
  274.  *  User wants to be remote sysop.
  275.  *  Let them, if they are allowed to.
  276.  */
  277.  
  278. mksys()
  279. {
  280.   if (!(port->priv & p_sysop) or !(port->user->options & u_sysop)or!(pass()))
  281.     { port->msg = mwhat; return; }
  282.  
  283.   port->flags setbit p_clrsys;
  284.   port->mode = sysop;
  285.   if (!port->tmode)
  286.   {
  287.      cmdtnc();
  288.      onetnc("cr of\n");
  289.      onetnc("cp on\n");
  290.      onetnc("se $7f\n");
  291.      convtnc();
  292.   }
  293. }
  294.  
  295. pass()
  296. {
  297.   int count,psn,lpsn;
  298.   char temp[4], pword[5];
  299.   for (count = 0, lpsn = 0; count < 4; count++)
  300.     {
  301.       while ((psn=(rand()/512))== lpsn);
  302.       sprintf (temp, "%3u", psn+1);
  303.       outstr(temp);
  304.       pword[count] = *(keylst+psn);
  305.       lpsn = psn;
  306.     }
  307.     outstr("\n");
  308.     getdat();
  309.     if (matchn(port->line, pword, 4)) return true;
  310.     return false;
  311.  }
  312.  
  313. /*
  314.  *  Lock up the current window for no more than 180 seconds.
  315.  */
  316.  
  317. lock()
  318. {
  319.   long l;
  320.   if (!(s_flag & s_dv)) return;
  321.   outstr("\nWindow locked");
  322.   while (true)
  323.   {
  324.     getcomd(); if (port->opt2 isnt 'H') break;
  325.     switchw();
  326.   }
  327.   outstr("-unLOCKED\n");
  328.   return;
  329. }
  330.